/*
#Copyright (c) 2013, Philippe Bordron <philippe.bordron@gmail.com>
#
# This file is part of SIPPER.
#
# DCC is free software: you can redistribute it and/or modify
# it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# DCC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU LESSER GENERAL PUBLIC LICENSE for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# along with SIPPER.  If not, see <http://www.gnu.org/licenses/>
*/
package combi.wip.sipper.modeling.integratedModel;

import java.util.Collection;
import java.util.List;

import combi.sipper.modeling.distances.DistanceBetweenGenes;
import combi.wip.sipper.modeling.Protein;
import combi.wip.sipper.modeling.genomes.Gene;
import combi.wip.sipper.modeling.genomes.Genome;
import combi.wip.sipper.modeling.integratedModel.graphs.GraphGenomicModel;
import combi.wip.sipper.modeling.metabolicNetworks.MetabolicNetworkWithEnzymes;
import combi.wip.sipper.modeling.reactions.Reaction;

public abstract class IntegratedModel<G extends Gene<E>,C,R extends Reaction<C>, E extends Protein> {

	protected MetabolicNetworkWithEnzymes<C, Reaction<C>, E> meta;
	protected Genome<Gene<E>,E> genome;
	protected DistanceBetweenGenes<G> distance;
	protected GraphGenomicModel<G, C, R, E> graph;
	
	public abstract Collection<Gene<E>> getGeneSet();

	public abstract Collection<Protein> getEnzymeSet();
	
	public abstract Collection<Protein> getDeepProteinSet();
	
	public abstract Collection<Reaction<C>> getReactionSet();
	
	
	public MetabolicNetworkWithEnzymes<C, Reaction<C>, E> getMetabolism()
	{
		return meta;
	}
	
	public Genome<Gene<E>,E> getGenome()
	{
		return genome;
	}

	public abstract void generateGraph();
	
	public void setGraph(GraphGenomicModel<G, C, R, E> graph)
	{
		this.graph = graph;
	}
	
	public GraphGenomicModel<G, C, R, E> getGraph() {
		return graph;
	}

	public abstract List<Gene<E>> getGenes(Collection<Integer> vertices);
	public abstract List<Reaction<C>> getReactions(Collection<Integer> vertices);
	
	
}
